package com.xbai.spark.core.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * mapPartitions(func) 算子
  * 作用：类似于map，但独立地在 RDD 的每一个分片（分区）上运行，因此在类型为 T 的 RDD 上运行时，func 的函数类型必须是 Iterator[T] => Iterator[U]
  * 假设有 N 个元素，有 M 个分区，那么map 的函数的将被调用 N 次,而 mapPartitions 被调用 M 次,一个函数一次处理所有分区。
  * 案例：创建一个RDD，使每个元素*2组成新的RDD
  *
  * @author xbai
  * @Date 2020/12/28
  */
object Spark03_MapPartitions {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("mapPartitions")
    val sc = new SparkContext(conf)

    val listRDD: RDD[Int] = sc.makeRDD(1 to 10)
    val mapPartitionsRDD: RDD[Int] = listRDD.mapPartitions(data => {
      data.map(_ * 2)
    })
    mapPartitionsRDD.collect().foreach(println)
  }
}
